#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitComponent();
    if(this->editorPlus == nullptr || this->textparser == nullptr){
        QApplication::exit(1);
    }
    InitInfoGroup();
    this->editorPlus->setFocus();
    this->config = ConfigManager::instance();
    if(!config){
        QApplication::exit(-1);
    }
    connect(editorPlus, &QTextEditorPlus::textChanged, this, &MainWindow::editorPlus_textChanged);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/**
 * @brief MainWindow::InitComponent 初始化editPlus组件
 */
void MainWindow::InitComponent(){
    QGroupBox *input = findChild<QGroupBox *>("input_group");
    if (input){
        QTextEditorPlus *textEdit = new QTextEditorPlus(input);
        QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(ui->input_group->layout());
        if(!layout) {
            layout = new QVBoxLayout(input);
            input->setLayout(layout);
        }
        layout->addWidget(textEdit);
        this->editorPlus = textEdit;
    }
    this->textparser = new TextParser();
    this->ui->dateEdit->setDate(QDate::currentDate());

}

/**
 * @brief MainWindow::InitInfoGroup 清空信息界面数据
 */
void MainWindow::InitInfoGroup(){
    QList<QLineEdit*> lineEdits = findChildren<QLineEdit*>();
    for (QLineEdit* edit : lineEdits){
        edit->clear();
    }
    this->ui->device_combo->setCurrentIndex(0);
    this->ui->problem_edit->setText("");
    this->ui->tryfix_edit->setText("");
    this->ui->game_problem_radio->setChecked(true);
    this->ui->acc_problem_radio->setChecked(false);
    this->device_raw_type = -1;
}

/**
 * @brief MainWindow::editorPlus_textChanged editPlus输入框内容变化处理函数
 */
void MainWindow::editorPlus_textChanged(){
    QString text = this->editorPlus->toPlainText();
    if(text.isEmpty()){
        return;
    }
    QMap<QString, QString> fetchData = this->textparser->parseInfo(text);
    fetchInfo(fetchData);
}

/**
 * @brief MainWindow::fetchInfo 将数据填入对应的界面
 * @param fetchData 传入已经分析处理好的数据
 */
void MainWindow::fetchInfo(QMap<QString, QString> fetchData) {
    // 初始化界面
    InitInfoGroup();

    // 映射表：key 对应 UI 控件，value 是需要设置的控件的 setter
    QMap<QString, std::function<void(const QString&)>> uiMap;

    // 直接映射简单设置的 UI 控件
    uiMap["版本号"] = [this](const QString &value) { this->ui->software_edit->setText(value); };
    uiMap["系统版本"] = [this](const QString &value) { this->ui->system_edit->setText(value); };
    uiMap["游戏"] = [this](const QString &value) { this->ui->game_edit->setText(value); };
    uiMap["账号"] = [this](const QString &value) { this->ui->account_edit->setText(value); };
    uiMap["网络"] = [this](const QString &value) { this->ui->area_edit->setText(value); };
    uiMap["节点"] = [this](const QString &value) { this->ui->node_edit->setText(value); };
    uiMap["描述"] = [this](const QString &value) { this->ui->problem_edit->setText(value); };
    uiMap["尝试"] = [this](const QString &value) { this->ui->tryfix_edit->setText(value); };

    // 遍历 fetchData，根据匹配到的 key 执行对应的设置
    for (auto it = fetchData.begin(); it != fetchData.end(); ++it) {
        const QString &key = it.key();
        const QString &value = it.value();

        // 直接映射匹配
        for (auto mapIt = uiMap.begin(); mapIt != uiMap.end(); ++mapIt) {
            if (key.contains(mapIt.key())) {
                mapIt.value()(value);  // 设置对应控件的文本
                break;
            }
        }

        // 处理设备型号、设备端
        if (key.contains("型号") || key.contains("设备端")) {
            this->ui->device_name_edit->setText(value);
            switch (this->config->getDeviceType(value)){
            case ConfigManager::ANDROID:
            {
                this->device_raw_type = ANDROID;
                this->ui->device_combo->setCurrentIndex(2);
                break;
            }
            case ConfigManager::IOS:
            {
                this->device_raw_type = IOS;
                this->ui->device_combo->setCurrentIndex(2);
                break;
            }
            case ConfigManager::HOST:
            {
                this->device_raw_type = -1;
                this->ui->device_combo->setCurrentIndex(1);
                break;
            }
            default:
                this->device_raw_type = -1;
                this->ui->device_combo->setCurrentIndex(0);
            }
        }
    }
}

/**
 * @brief MainWindow::on_clear_btn_clicked 清理editorPlus内容及InfoGroup内容
 */
void MainWindow::on_clear_btn_clicked()
{
    InitInfoGroup();
    this->editorPlus->clear();
    this->editorPlus->setFocus();
}

/**
 * @brief MainWindow::on_flush_device_info_clicked 重新读取设备信息
 */
void MainWindow::on_flush_device_info_clicked()
{
    this->config->readConfigFile();
}

/**
 * @brief MainWindow::on_copy_btn_clicked 一键复制按下后的操作
 */
void MainWindow::on_copy_btn_clicked()
{
    if (this->editorPlus->toPlainText().isEmpty()) {
        this->editorPlus->setFocus();
        return;
    }

    QString result = generateReport(
        this->ui->device_combo->currentIndex(),
        this->ui->game_problem_radio->isChecked()
        );

    if (result.isEmpty()) {
        return;
    }

    // 写入剪贴板数据
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setText(result);
}



/**
 * @brief MainWindow::generateReport 生成复制信息
 * @param deviceType 设备类型，用于区分PC、主机和移动端
 * @param isGameProblem 是否是游戏问题，用于区分表格内容
 * @return 生成的复制信息
 */
QString MainWindow::generateReport(int deviceType, bool isGameProblem)
{
    QStringList fields;

    // 添加日期
    fields << this->ui->dateEdit->text();

    switch (deviceType) {
    case PC:
        if (isGameProblem) {
            appendCommonPCFields(fields);
            fields << ""; // 跳过加速模式
            fields << this->ui->software_edit->text();
            fields << this->ui->account_edit->text();
            fields << ""; // 跳过问题类型
            fields << this->ui->problem_edit->toPlainText();
        } else {
            fields << ""; // 跳过系统版本
            fields << this->ui->software_edit->text();
            fields << ""; // 跳过加速模式
            fields << this->ui->account_edit->text();
            fields << ""; // 跳过问题类型和问题/报错
            fields << ""; // 跳过其他
            fields << this->ui->problem_edit->toPlainText();
        }
        break;

    case HOST:
        appendCommonHostFields(fields, isGameProblem);
        break;

    case MOBILE:
        appendCommonMobileFields(fields, isGameProblem);
        break;

    default:
        return "";
    }

    return fields.join("\t");
}

/**
 * @brief MainWindow::appendCommonPCFields 添加PC通用数据
 * @param fields 原始数据
 */
void MainWindow::appendCommonPCFields(QStringList &fields)
{
    fields << this->ui->game_edit->text();
    fields << this->ui->area_edit->text();
    fields << this->ui->node_edit->text();
}

/**
 * @brief MainWindow::appendCommonHostFields 添加主机通用数据
 * @param fields 原始数据
 * @param isGameProblem 区分是否是游戏问题，以区别添加的数据
 */
void MainWindow::appendCommonHostFields(QStringList &fields, bool isGameProblem)
{
    if (isGameProblem) {
        fields << ""; // 跳过加速方式
        fields << this->ui->software_edit->text();
        fields << this->ui->device_name_edit->text();
        fields << this->ui->game_edit->text();
        fields << this->ui->account_edit->text();
        fields << ""; // 跳过问题类型
        fields << this->ui->problem_edit->toPlainText();
    } else {
        fields << ""; // 跳过加速方式
        fields << this->ui->software_edit->text();
        fields << ""; // 跳过设备端、app版本
        fields << ""; // 跳过其他
        fields << this->ui->device_name_edit->text();
        fields << this->ui->account_edit->text();
        fields << ""; // 跳过问题类型
        fields << "";
        fields << this->ui->problem_edit->toPlainText();
    }
}

/**
 * @brief MainWindow::appendCommonMobileFields 添加移动通用数据
 * @param fields 原始数据
 * @param isGameProblem 区分是否是游戏问题，以区别添加的数据
 */
void MainWindow::appendCommonMobileFields(QStringList &fields, bool isGameProblem)
{
    fields << ((this->device_raw_type == ANDROID) ? "安卓" :
                   (this->device_raw_type == IOS) ? "IOS" : "Unknown");
    fields << this->ui->software_edit->text();
    fields << this->ui->account_edit->text();

    if (isGameProblem) {
        fields << this->ui->game_edit->text();
        fields << this->ui->area_edit->text();
        fields << this->ui->node_edit->text();
        fields << ""; // 跳过模式、问题类型
        fields << "";
        fields << this->ui->problem_edit->toPlainText();
    } else {
        fields << this->ui->device_name_edit->text() + "  " + this->ui->system_edit->text();
        fields << ""; // 跳过问题类型
        fields << this->ui->problem_edit->toPlainText();
    }
}


/**
 * @brief MainWindow::on_copy_btn_clicked 一键复制按下后的操作
 */
// void MainWindow::on_copy_btn_clicked()
// {
//     if (this->editorPlus->toPlainText().isEmpty()) {
//         this->editorPlus->setFocus();
//         return;
//     }
//     QString result = "";
//     switch(this->ui->device_combo->currentIndex()){
//     case PC:
//     {
//         if(this->ui->game_problem_radio->isChecked()){
//             // 添加日期
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 添加游戏名称
//             result += this->ui->game_edit->text();
//             result += "\t";

//             // 添加地区宽带
//             result += this->ui->area_edit->text();
//             result += "\t";

//             // 添加节点
//             result += this->ui->node_edit->text();
//             result += "\t";

//             // 跳过加速模式
//             result += "\t";

//             // 添加奇游版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 添加用户账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             // 跳过问题类型
//             result += "\t";

//             // 添加问题描述
//             result += this->ui->problem_edit->toPlainText();

//         }else{
//             // 添加时间
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 跳过系统版本
//             result += "\t";

//             // 添加奇游版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 跳过加速模式
//             result += "\t";

//             // 添加账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             //跳过问题类型和问题/报错
//             result += "\t\t";

//             //添加问题描述
//             result += this->ui->problem_edit->toPlainText();
//         }
//         break;
//     }
//     case HOST:
//     {
//         if(this->ui->game_problem_radio->isChecked()){
//             // 添加时间
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 跳过加速方式
//             result += "\t";

//             // 添加版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 添加主机设备
//             result += this->ui->device_name_edit->text();
//             result += "\t";

//             // 添加游戏名称
//             result += this->ui->game_edit->text();
//             result += "\t";

//             // 添加账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             // 跳过问题类型
//             result += "\t";

//             // 添加详细描述
//             result += this->ui->problem_edit->toPlainText();

//         }else{
//             // 添加时间
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 跳过加速方式
//             result += "\t";

//             // 添加版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 跳过设备端、app版本
//             result += "\t\t";

//             // 添加主机设备
//             result += this->ui->device_name_edit->text();
//             result += "\t";

//             // 添加奇游账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             // 跳过问题类型、问题/报错
//             result += "\t\t";

//             //添加详细描述
//             result += this->ui->problem_edit->toPlainText();
//         }
//         break;
//     }
//     case MOBILE:
//     {
//         if(this->ui->game_problem_radio->isChecked()){
//             // 添加日期
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 添加设备端
//             switch (this->device_raw_type) {
//             case ANDROID:
//             {
//                 result += "安卓";
//                 break;
//             }
//             case IOS:
//             {
//                 result += "IOS";
//                 break;
//             }
//             default:
//                 result += "Unknown";
//                 break;
//             }
//             result += "\t";

//             // 添加版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 添加用户账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             // 添加游戏名称
//             result += this->ui->game_edit->text();
//             result += "\t";

//             // 添加地区宽带
//             result += this->ui->area_edit->text();
//             result += "\t";

//             // 添加节点
//             result += this->ui->node_edit->text();
//             result += "\t";

//             // 跳过模式、问题类型
//             result += "\t\t";

//             // 添加问题描述
//             result += this->ui->problem_edit->toPlainText();

//         }else{
//             // 添加时间
//             result += this->ui->dateEdit->text();
//             result += "\t";

//             // 添加设备端
//             switch (this->device_raw_type) {
//             case ANDROID:
//             {
//                 result += "安卓";
//                 break;
//             }
//             case IOS:
//             {
//                 result += "IOS";
//                 break;
//             }
//             default:
//                 result += "Unknown";
//                 break;
//             }
//             result += "\t";

//             // 添加版本号
//             result += this->ui->software_edit->text();
//             result += "\t";

//             // 添加奇游账号
//             result += this->ui->account_edit->text();
//             result += "\t";

//             // 添加品牌信号、系统版本
//             result += this->ui->device_name_edit->text();
//             result += "  ";
//             result += this->ui->system_edit->text();
//             result += "\t";

//             // 跳过问题类型
//             result += "\t";

//             // 添加问题描述
//             result += this->ui->problem_edit->toPlainText();

//         }
//         break;
//     }
//     default:
//     {
//         result = "";
//     }
//     }
//     if(result.isEmpty()){
//         return;
//     }

// }

